/*
 * Copyright (C) 2024 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the 'License');
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an 'AS IS' BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef IMAGE_KNIFE_C_IMAGEKNIFE_OPTION_H
#define IMAGE_KNIFE_C_IMAGEKNIFE_OPTION_H

#include <map>
#include <string>
#include <functional>
#include <arkui/native_type.h>
#include "dns_option.h"
#include "imageknife_type.h"
#include "imageknife_loader.h"
#include "image_source.h"
#include "data/imageknife_colorfilter.h"
#include "transformation/transformation.h"
#include "border_option.h"

namespace ImageKnifePro {

/**
 * @brief Http请求参数
 */
class HttpRequestOption {
public:
    /**
     * @brief CA证书路径
     */
    std::string caPath;
    /**
     * @brief http请求连接超时时间，单位毫秒
     * 值小于等于0表示使用默认的超时时间
     */
    int32_t connectTimeout = 0;
    /**
     * @brief http读取超时时间，单位毫秒
     * 值小于等于0表示使用默认的超时时间
     */
    int32_t readTimeout = 0;
};

/**
 * @brief 图片加载选项参数
 */
class ImageKnifeOption {
public:
    /**
     * @brief 主图资源: STRING, PIXELMAP, RESOURCE，必须设置
     * Pixelmap 类型图片将直接显示不执行责任链
     * RESOURCE 资源读取依赖ArkTs页面上下文，C API方式使用时不生效
     */
    ImageSource loadSrc;
    /**
     * @brief 占位图资源: STRING, PIXELMAP, RESOURCE
     * Pixelmap 类型图片将直接显示不执行责任链
     * RESOURCE 资源读取依赖ArkTs页面上下文，C API方式使用时不生效
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新
     */
    ImageSource placeholderSrc;
    /**
     * @brief 缩略图资源: STRING, PIXELMAP, RESOURCE
     * Pixelmap 类型图片将直接显示不执行责任链
     * RESOURCE 资源读取依赖ArkTs页面上下文，C API方式使用时不生效
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新
     */
    ImageSource thumbnailSrc;
    /**
     * @brief 错误图资源: STRING, PIXELMAP, RESOURCE
     * 在主图和缩略图都加载失败或无效的情况下进行加载展示
     * Pixelmap 类型图片将直接显示不执行责任链
     * RESOURCE 资源读取依赖ArkTs页面上下文，C API方式使用时不生效
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新
     */
    ImageSource errorSrc;
    /**
     * @brief 自定义http header
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    std::multimap<std::string, std::string> httpHeaders;
    /**
     * @brief 自定义dns设置
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    std::shared_ptr<DnsOption> dnsOption;
    /**
     * @brief 自定义缓存key生成所用的签名
     * 变更该属性会导致主图请求状态变更，重新开始加载
     */
    std::string signature;
    /**
     * @brief 给加载过程中的pixelmap设置memory name用于定位内存问题，不影响图片加载
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    std::string pixelName;
    /**
     * @brief 加载队列的优先级
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    Priority priority = Priority::LOW;
    /**
     * @brief 主图填充效果
     */
    ArkUI_ObjectFit objectFit = ARKUI_OBJECT_FIT_CONTAIN;
    /**
     * @brief 占位图填充效果
     */
    ArkUI_ObjectFit placeholderObjectFit = ARKUI_OBJECT_FIT_CONTAIN;
    /**
     * @brief 缩略图填充效果
     */
    ArkUI_ObjectFit thumbnailObjectFit = ARKUI_OBJECT_FIT_CONTAIN;
    /**
     * @brief 错误图填充效果
     */
    ArkUI_ObjectFit errorObjectFit = ARKUI_OBJECT_FIT_CONTAIN;
    /**
     * @brief 主图期望的图像内容显示方向
     * 变更该属性会导致主图请求状态变更，重新开始加载
     */
    Orientation orientation = Orientation::AUTO;
    /**
     * @brief 主图期望的解码动态范围
     * 变更该属性会导致主图请求状态变更，重新开始加载
     */
    DynamicRange dynamicRange = DynamicRange::AUTO;
    /**
     * @brief 设置图像拉伸时可调整大小的图像选项
     */
    std::shared_ptr<ResizableOption> resizeable = nullptr;
    /**
     * @brief 组件圆角边框效果
     */
    std::shared_ptr<BorderOption> border = nullptr;
    /**
     * @brief 主图选择的小端文件缓存名称
     * 默认为空，即不使用小端文件缓存，用大端文件文件缓存进行读写
     * 小端文件缓存需要添加初始化，可以添加多个，各个文件缓存实例之间不会互相LRU
     * 只对默认的文件缓存拦截器有效
     * 当名称匹配失败时，使用大端文件缓存进行读写兜底
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    std::string fileCacheName;
    /**
     * @brief 图片写缓存策略，默认同时使用内存和文件缓存
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    CacheStrategy writeCacheStrategy = CacheStrategy::DEFAULT;
    /**
     * @brief 设置主图是否仅使用缓存进行图片加载。仅使用缓存如没有对应图片缓存，则加载失败
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    bool onlyRetrieveFromCache = false;
    /**
     * @brief 监听请求加载的对象，可设置相关加载回调
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    std::shared_ptr<OnLoadCallBack> onLoadListener = nullptr;
    /**
     * @brief 监听监听网络下载进度回调
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    std::function<void(double progress)> progressListener = nullptr;
    /**
     * @brief 系统Image组件加载完成的回调
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    std::function<void(EventImage eventImage)> onComplete = nullptr;
    /**
     * @brief 解析自ArtTs的页面上下文，使用C API时无效
     */
    Context context;
    /**
     * @brief 图片加载loader，未设置时将使用全局默认的loader
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    std::shared_ptr<ImageKnifeLoader> imageLoader = nullptr;
    /**
     * @brief 图形变换对象，在图片加载过程中执行一次，在multiTransformation不为空的情况下无效
     * 变更该属性会导致主图请求状态变更，重新开始加载
     */
    std::shared_ptr<Transformation> transformation = nullptr;
    /**
     * @brief 多次图形变换对象，不为空的情况的下会忽略transformation
     * 变更该属性会导致主图请求状态变更，重新开始加载
     */
    std::shared_ptr<MultiTransformation> multiTransformation = nullptr;
    /**
     * @brief 用户自定义数据类型，可在自定义拦截器中取得使用
     */
    void* customData = nullptr;
    /**
     * @brief 用户自定义finalize回调，用于析构用户自定义数据，将在ImageKnifeOption析构时调用
     */
    std::function<void(void* customData)> onFinalize = nullptr;
    /**
     * @brief 自定义自定义证书路径
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    HttpRequestOption httpOption;
    /**
     * @brief 设置图片的ColorFilter属性
     */
    std::shared_ptr<ImageKnifeColorFilter> colorFilter = nullptr;
    /**
     * @brief 降采样策略
     * 变更该属性会导致主图请求状态变更，重新开始加载
     */
    DownSamplingStrategy downSampling = DownSamplingStrategy::DEFAULT;
    /**
     * @brief 动图解码模式
     */
    AnimationDecodeMode animationDecodeMode = AnimationDecodeMode::AUTO;
    /**
     * @brief 解码图片的PixelMap内存分配模式
     * 在API15以下系统版本无效
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    AllocationMode allocationMode = AllocationMode::AUTO;
    /**
     * @brief 图片数据校验机制
     * 使用时机：【下载成功】
     * 校验失败的图片会被抛弃，默认进行校验
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    uint32_t crc32 = 0;
    /**
     * @brief 重试URL
     * 使用时机：【下载失败，图片校验失败】
     * 在主图请求状态未发生变换的情况下，变更该属性不会触发更新，不会影响在加载的请求
     */
    std::vector<std::string> fallbackUrls;
    virtual ~ImageKnifeOption();
};

} // end of namespace

#endif // IMAGE_KNIFE_C_IMAGEKNIFE_OPTION_H
